"""WMS3D系统日志模块。

该模块提供统一的日志记录功能，支持：
1. 结构化日志记录
2. 不同级别的日志输出
3. 日志格式化和过滤
4. 性能监控日志
"""

import logging
import sys
from typing import Any, Dict, Optional

import structlog
from structlog.stdlib import LoggerFactory


def setup_logging(
    level: str = "INFO",
    format_string: str | None = None,
    json_format: bool = False,
) -> None:
    """设置系统日志配置。

    Args:
        level: 日志级别
        format_string: 自定义格式字符串
        json_format: 是否使用JSON格式
    """
    # 配置structlog
    structlog.configure(
        processors=[
            structlog.stdlib.filter_by_level,
            structlog.stdlib.add_logger_name,
            structlog.stdlib.add_log_level,
            structlog.stdlib.PositionalArgumentsFormatter(),
            structlog.processors.TimeStamper(fmt="iso"),
            structlog.processors.StackInfoRenderer(),
            structlog.processors.format_exc_info,
            structlog.processors.UnicodeDecoder(),
            structlog.processors.JSONRenderer() if json_format else structlog.dev.ConsoleRenderer(),
        ],
        context_class=dict,
        logger_factory=LoggerFactory(),
        wrapper_class=structlog.stdlib.BoundLogger,
        cache_logger_on_first_use=True,
    )

    # 配置标准库logging
    logging.basicConfig(
        format=format_string or "%(asctime)s - %(name)s - %(levelname)s - %(message)s",
        level=getattr(logging, level.upper()),
        stream=sys.stdout,
    )


def get_logger(name: str) -> structlog.stdlib.BoundLogger:
    """获取日志记录器。

    Args:
        name: 日志记录器名称

    Returns:
        BoundLogger: 结构化日志记录器
    """
    return structlog.get_logger(name)


def log_performance(
    logger: structlog.stdlib.BoundLogger,
    operation: str,
    duration: float,
    **kwargs: Any,
) -> None:
    """记录性能指标。

    Args:
        logger: 日志记录器
        operation: 操作名称
        duration: 操作耗时（秒）
        **kwargs: 额外的性能指标
    """
    logger.info(
        "performance_metric",
        operation=operation,
        duration_seconds=duration,
        **kwargs,
    )


def log_error(
    logger: structlog.stdlib.BoundLogger,
    error: Exception,
    context: dict[str, Any] | None = None,
    **kwargs: Any,
) -> None:
    """记录错误信息。

    Args:
        logger: 日志记录器
        error: 异常对象
        context: 错误上下文信息
        **kwargs: 额外的错误信息
    """
    logger.error(
        "error_occurred",
        error_type=type(error).__name__,
        error_message=str(error),
        context=context or {},
        **kwargs,
    )


def log_audit_event(
    logger: structlog.stdlib.BoundLogger,
    event_type: str,
    user_id: str,
    resource_type: str,
    resource_id: str,
    action: str,
    **kwargs: Any,
) -> None:
    """记录审计事件。

    Args:
        logger: 日志记录器
        event_type: 事件类型
        user_id: 用户ID
        resource_type: 资源类型
        resource_id: 资源ID
        action: 操作类型
        **kwargs: 额外的审计信息
    """
    logger.info(
        "audit_event",
        event_type=event_type,
        user_id=user_id,
        resource_type=resource_type,
        resource_id=resource_id,
        action=action,
        **kwargs,
    )


# 初始化默认日志配置
setup_logging()
